package com.ly.jwt.config;

import com.ly.jwt.utils.BaseException;
import com.ly.jwt.utils.JsonResult;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletRequest;

/**
 * 本文只是没有系统的处理异常，一般应用系统中，我们都会定义多个异常类，来处理不同的异常情况。
 * 然后通过异常处理类，处理不同种类的异常。
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    private Logger logger = LoggerFactory.getLogger(getClass());

    /**
     * 给这个方法加上@ExceptionHandler注解，这个方法就会处理类中其他方法（被@RequestMapping注解）抛出的异常。
     *
     * @ExceptionHandler(可以用来统一处理方法抛出的异常)注解中可以添加参数，参数是某个异常类的class，代表这个方法专门处理该类异常 <P>
     * 有些情况下我们会给标识了@RequestMapping的方法添加@ResponseBody，比如使用Ajax的场景，直接返回字符串，
     * 异常处理类也可以如此操作，添加@ResponseBody注解后，可以直接返回字符串，
     * </P>
     */
    //空指针异常
    @ExceptionHandler(value = {NullPointerException.class})
    public JsonResult<?> NullPointerException(HttpServletRequest request, Exception e) {
        logger.error("404", e);
        return new JsonResult<>("404", e.getMessage(), "null");
    }

    //好像是全局异常
    @ExceptionHandler(value = {Exception.class})
    public JsonResult<?> Exception(HttpServletRequest request, Exception e) {
        String code = ((BaseException) e).getCode();
        logger.error(code, e);
        return new JsonResult<>(code, e.getMessage(), "null");
    }
}

